#include <iostream>
#include <cstring>

#define NAMESIZE	32

using namespace std;

class Person {
    private:
    // 成员变量
    int m_id;
    char m_name[NAMESIZE];

    public:
    // 成员方法
    // 关于构造函数返回值问题：
    // https://stackoverflow.com/questions/10356109/c-constructors-have-no-return-type-just-exactly-why
    // or
    // https://bbs.csdn.net/topics/120030004
    Person(); // 构造方法，类实例化时默认调用
    Person(int id, const char *name); // 构造方法重载
    Person(const Person &p); // 拷贝构造方法
    ~Person() { cout << "~Person()\n"; } // 析构方法，类对象被释放时调用
    void show();
    void setId(int id);
    void setName(const char *name);
};

Person::Person()
{
    cout << "构造方法调用\n";
}

Person::Person(int id, const char *name): m_id(id) // 构造方法初始化列表的方式赋值
{
    //m_id = id;
    strncpy(m_name, name, NAMESIZE);
}

Person::Person(const Person &p)
{
	cout << "Person(const Person &p) called" << endl;
	m_id = p.m_id;
	strncpy(m_name, p.m_name, NAMESIZE);
}

void Person::show() 
{
    cout << m_id << ", " << m_name << endl;
}

void Person::setId(int id)
{
    m_id = id;
}

void Person::setName(const char *name)
{
    strncpy(m_name, name, NAMESIZE);
}

int main(void)
{
    // p1对象
    Person p1;
    Person p2(2, "李四");
    Person p3 = p2;
    Person p4(p2);

    p3.show();

    p2.show();

    p1.setId(1);
    p1.setName("张三");

    p1.show();

    return 0;
}

